package com.xiaoai.juc;

import java.util.concurrent.*;

/**
 * 线程池：三大方法，七大参数，四种拒绝策略
 * Executors 工具类 3大方法
 * 
 * @Author
 * @Date 2021-09-22 00:09
 */
public class pool1_Demo01 {

    public static void main(String[] args){
//        ExecutorService threadPool = Executors.newSingleThreadExecutor();// 单个线程
//        ExecutorService threadPool = Executors.newFixedThreadPool(5); // 创建一个固定的线程池大小
//        ExecutorService threadPool = Executors.newCachedThreadPool(); // 可伸缩的，遇强则强，遇弱则弱

        /**
         * 七大参数
         * 四种拒绝策略
         * ThreadPoolExecutor.AbortPolicy   队列满，抛出异常
         * ThreadPoolExecutor.callerRunsPolicy  队列满，哪来的去哪里，返回之前的线程
         * ThreadPoolExecutor.DiscardPolicy 队列满，不抛出异常，丢掉任务
         * ThreadPoolExecutor.DiscardoldestPolicy 队列满，尝试和最早的竞争，竞争失败丢掉任务。
         *
         *
         * 最大线程怎么定义：
         *  cpu密集型：最大线程数可看cpu核心数，一般与cpu核心数一致可效率最高
         *  io密集型： >判断程序中十分耗io的线程
         */
        System.out.println("cpu核心数："+Runtime.getRuntime().availableProcessors()); // 获取核心数
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,  // 核心线程数
                5,  // 最大线程数
                3, // 空闲线程存活时间，时间到，线程空闲则关闭，对核心线程无效
                TimeUnit.SECONDS,  // 超时单位
                new LinkedBlockingDeque<>(3),  // 任务等候队列
                Executors.defaultThreadFactory(),  // 默认线程工厂
                new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略

        try {
            for (int i = 0; i < 20; i++) {
                int temp = i;
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName()+":"+temp);
                });
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 关闭线程池
            threadPool.shutdown();
        }

    }


}
